跳到主要内容

Linux 的 proc 目录 - 系统属性

进程属性那篇笔记讲了 /proc 目录除了进程的信息,还包含了大量的系统信息

如果想快速的查看非进程文件夹可以使用

$ find /proc/ -maxdepth 1 ! -regex '.*/[0-9]*'

然后会列出 /proc 目录中一些进程相关的目录,每个目录中是当程本身相关信息的文件。

下面介绍下可能会用到的部分

buddyinfo 诊断内存碎片信息

用于诊断内存碎片问题的相关信息文件;

cmdline 启动参数

在启动时传递至内核的相关参数信息,这些信息通常由 lilo 或 grub 等启动管理工具进行传递;

$ more /proc/cmdline
initrd=\initrd.img panic=-1 pty.legacy_count=0 nr_cpus=8
$

cpuinfo 处理器的相关信息

处理器的相关信息的文件;

$ more /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 158
model name : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
stepping : 9
microcode : 0xffffffff
cpu MHz : 2807.997
cache size : 6144 KB
physical id : 0
siblings : 8
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 21
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss h
t syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_
2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti ssbd ibrs ibpb stibp fs
gsbase bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves flush_l1d arch_capabil
ities
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds
bogomips : 5615.99
clflush size : 64
cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
$

crypto 已安装的密码算法

系统上已安装的内核使用的密码算法及每个算法的详细信息列表;

$ more /proc/crypto
name : crc32
driver : crc32-pclmul
module : crc32_pclmul
priority : 200
refcnt : 1
selftest : passed
type : shash
blocksize : 1
digestsize : 4

name : __ghash
driver : cryptd(__ghash-pclmulqdqni)
module : cryptd
priority : 50
refcnt : 1
selftest : passed
type : ahash
async : yes
blocksize : 16
digestsize : 16
......
$

devices 已经加载设备

系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组名(与主设备号对应的设备类型);

$ more /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
21 sg
108 ppp
128 ptm
136 pts
245 vhost-vdpa
246 vfio
247 uio
248 macvtap
249 ipvtap
250 bsg
251 rtc
252 dax
253 dimmctl
254 ndctl

Block devices:
1 ramdisk
7 loop
$

diskstats I/O统计信息列表

每块磁盘设备的磁盘 I/O 统计信息列表;(内核2.5.69以后的版本支持此功能)

$ more /proc/diskstats
1 0 ram0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 ram1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 2 ram2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 3 ram3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 4 ram4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 5 ram5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 6 ram6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 7 ram7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 8 ram8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 9 ram9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 10 ram10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 11 ram11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 12 ram12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 13 ram13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 14 ram14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 15 ram15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 0 loop0 1262 0 190796 442 0 0 0 0 0 2490 442 0 0 0 0 0 0
7 1 loop1 2411 0 357528 1403 0 0 0 0 0 1780 1403 0 0 0 0 0 0
7 2 loop2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 3 loop3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 4 loop4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 5 loop5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 6 loop6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 7 loop7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8 0 sda 57 0 450 30 8303 172 8390832 5605 0 20870 5805 0 0 0 0 95 170
8 16 sdb 677 244 93220 382 47 37 624 55 0 580 461 4 0 48 2 19 21
8 32 sdc 5376 2911 483418 2005 2287 4437 156192 8725 0 6530 11428 64 0 93072 21 813 675
8 48 sdd 22628 797 828194 10604 1628 8331 78656 3806 0 4650 15029 126 0 1304 35 417 582
$

filesystems 当前支持的文件系统

当前被内核支持的文件系统类型列表文件,被标示为 nodev 的文件系统表示不需要块设备的支持;通常 mount 一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型;

$ more /proc/filesystems
nodev sysfs
nodev tmpfs
nodev bdev
nodev proc
nodev cgroup
nodev cgroup2
nodev cpuset
nodev devtmpfs
nodev binfmt_misc
nodev debugfs
nodev tracefs
nodev sockfs
nodev bpf
nodev pipefs
nodev ramfs
nodev hugetlbfs
nodev rpc_pipefs
nodev devpts
ext3
ext2
ext4
squashfs
vfat
msdos
iso9660
nodev nfs
nodev nfs4
nodev nfsd
nodev cifs
$

interrupts 中断号列表

X86 或 X86_64 体系架构系统上每个 IRQ 相关的中断号列表;多路处理器平台上每个 CPU 对于每个 I/O 设备均有自己的中断号;

$ more /proc/interrupts 
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7
8: 0 0 0 0 0 0 0 0 IO-APIC 8-edge rtc0
9: 5 0 0 0 0 0 0 0 IO-APIC 9-fasteoi acpi
NMI: 0 0 0 0 0 0 0 0 Non-maskable interrupts
LOC: 0 0 0 0 0 0 0 0 Local timer interrupts
SPU: 0 0 0 0 0 0 0 0 Spurious interrupts
PMI: 0 0 0 0 0 0 0 0 Performance monitoring interrupts
IWI: 0 0 0 0 0 0 0 0 IRQ work interrupts
RTR: 0 0 0 0 0 0 0 0 APIC ICR read retries
RES: 76711 53565 112353 50710 99066 46487 80956 48622 Rescheduling interrupts
CAL: 5704 3841 2812 2546 2550 2650 2521 2560 Function call interrupts
TLB: 0 0 0 0 0 0 0 0 TLB shootdowns
HYP: 84574 245 7902 60 245 159 106 82 Hypervisor callback interrupts
HRE: 0 0 0 0 0 0 0 0 Hyper-V reenlightenment interrupts
HVS: 314089 198162 308434 165186 313668 187081 297253 204460 Hyper-V stimer0 interrupts
ERR: 0
MIS: 0
PIN: 0 0 0 0 0 0 0 0 Posted-interrupt notification event
NPI: 0 0 0 0 0 0 0 0 Nested posted-interrupt event
PIW: 0 0 0 0 0 0 0 0 Posted-interrupt wakeup event
$

iomem 与 ioports 资源分布

在 proc 目录下有 iomem 和 ioports 文件,其主要描述了系统的 io 内存和 io 端口资源分布。

如下面所示,每个物理设备上的记忆体(RAM 或者 ROM)在系统内存中的映射信息;

$ more /proc/iomem
00000000-00000fff : reserved
00001000-0009ebff : System RAM
0009ec00-0009ffff : reserved
000a0000-000bffff : PCI Bus 0000:00
000c0000-000c7fff : Video ROM
000ca000-000cafff : Adapter ROM
000cc000-000cffff : PCI Bus 0000:00
000d0000-000d3fff : PCI Bus 0000:00
000d4000-000d7fff : PCI Bus 0000:00
000d8000-000dbfff : PCI Bus 0000:00
...
$

如下面所示,第一列表示注册的I/O端口范围,其后表示相关的设备;

$ more /proc/ioports
0000-0000 : dma1
0000-0000 : pic1
0000-0000 : timer0
0000-0000 : timer1
0000-0000 : keyboard
0000-0000 : keyboard
0000-0000 : rtc0
0000-0000 : dma page reg
0000-0000 : pic2
0000-0000 : dma2
0000-0000 : fpu
0000-0000 : ACPI PM1a_EVT_BLK
0000-0000 : ACPI PM1a_CNT_BLK
0000-0000 : ACPI PM_TMR
0000-0000 : ACPI GPE0_BLK
$

kallsyms 动态链接库

模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;(内核 2.5.71 以后的版本支持此功能);通常这个文件中的信息量相当大;

$ more /proc/kallsyms
0000000000000000 A irq_stack_union
0000000000000000 A __per_cpu_start
0000000000004000 A init_tss
0000000000004000 A __per_cpu_user_mapped_start
0000000000007000 A exception_stacks
000000000000c000 A gdt_page
000000000000d000 A kaiser_scratch
000000000000d010 A spec_ctrl_pcp
000000000000d040 A kaiser_enabled_pcp
000000000000d080 A cpu_debug_store
000000000000d120 A __per_cpu_user_mapped_end
...
$

loadavg 负载平均值

保存关于 CPU 和磁盘 I/O 的负载平均值,

如下:

$ more /proc/loadavg
0.08 0.02 0.01 1/544 2379

其前三列分别表示每1秒钟、每5秒钟及每15秒的负载平均值,类似于 uptime 命令输出的相关信息;

第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;

第五列表示此文件被查看前最近一个由内核创建的进程的 PID;

uptime 命令打印负载

补充:uptime 命令用于显示系统运行时间及负载。

-p #以好看的格式显示正常运行时间
-s #自系统启动来的时间
-h #打印帮助信息
-V #打印版本信息。

uptime 命令可以打印出系统总共运行了多长时间和系统的平均负载。uptime 命令显示的信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的 1 分钟、5 分钟和 15 分钟内的平均负载。

$ uptime
22:45:32 up 5:09, 0 users, load average: 0.02, 0.01, 0.00

locks 内核锁定的文件

参考 E.2.16. /PROC/LOCKS

保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;

每个锁定占据一行,且具有一个惟一的编号;

如下输出信息中每行的第二列表示当前锁定使用的锁定类别:

  • POSIX 表示目前较新类型的文件锁,由 lockf 系统调用产生,
  • FLOCK 是传统的UNIX文件锁,由flock系统调用产生;

第三列也通常由两种类型:

  • ADVISORY 表示不允许其他用户锁定此文件,但允许读取,
  • MANDATORY 表示此文件锁定期间不允许其他用户任何形式的访问;

第四列显示了锁是否允许持有者对文件进行 READ 或 WRITE 访问。

第五列显示持有锁的进程的 ID。

第六列是被锁定的文件 ID,格式为 “MAJOR-DEVICE:MINOR-DEVICE:INODE-NUMBER”。

第七和第八列显示文件的锁定区域的开始和结束。

$ more /proc/locks
1: FLOCK ADVISORY WRITE 1470 fd:00:50883616 0 EOF
2: FLOCK ADVISORY WRITE 1470 fd:00:50873817 0 EOF
3: FLOCK ADVISORY WRITE 1470 fd:00:50932932 0 EOF
4: FLOCK ADVISORY WRITE 1470 fd:00:50934286 0 EOF
5: FLOCK ADVISORY WRITE 1470 fd:00:17224805 0 EOF
6: OFDLCK ADVISORY READ -1 00:05:6513 0 EOF
7: FLOCK ADVISORY WRITE 1912 fd:00:17244310 0 EOF
8: FLOCK ADVISORY WRITE 1912 fd:00:566838 0 EOF
9: POSIX ADVISORY WRITE 1161 fd:00:34213527 0 0
10: FLOCK ADVISORY WRITE 975 fd:00:17235948 0 EOF
11: FLOCK ADVISORY WRITE 1161 fd:00:34213525 0 EOF
12: FLOCK ADVISORY WRITE 695 00:14:25589 0 EOF
13: POSIX ADVISORY WRITE 514 00:14:18362 0 EOF

meminfo 内存的信息

系统中关于当前内存的利用状况等的信息,常由 free 命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值;

$ more  /proc/meminfo
MemTotal: 1862988 kB
MemFree: 755340 kB
MemAvailable: 1378976 kB
Buffers: 2108 kB
Cached: 735564 kB
SwapCached: 0 kB
Active: 548264 kB
Inactive: 362056 kB
Active(anon): 170816 kB
Inactive(anon): 11668 kB
Active(file): 377448 kB
Inactive(file): 350388 kB
....

free 命令显示内存信息

Linux free 命令用于显示内存状态。它可以显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。

-b  以Byte为单位显示内存使用情况。
-k  以KB为单位显示内存使用情况。
-m  以MB为单位显示内存使用情况。
-o  不显示缓冲区调节列。
-t  显示内存总和列。(默认)
-V  显示版本信息。
-h  以合适的单位显示内存使用情况,最大为三位数,自动计算对应的单位值。单位有:
* B = bytes
* K = kilos
* M = megas
* G = gigas
* T = teras

-s<间隔秒数>  持续观察内存使用状况。

显示内存使用情况

$ free //显示内存使用信息
total used free shared buffers cached
Mem: 254772 184568 70204 0 5692 89892
-/+ buffers/cache: 88984 165788
Swap: 524280 65116 459164
$

周期性的查询内存使用信息

$ free -s 10 //每10s 执行一次命令
total used free shared buffers cached
Mem: 254772 187628 67144 0 6140 89964
-/+ buffers/cache: 91524 163248
Swap: 524280 65116 459164

total used free shared buffers cached
Mem: 254772 187748 67024 0 6164 89940
-/+ buffers/cache: 91644 163128
Swap: 524280 65116 459164
$

mounts 显示挂载点

在内核 2.4.29 版本以前,此文件的内容为系统当前挂载的所有文件系统

如下所示,其中

  • 第一列表示挂载的设备,
  • 第二列表示在当前目录树中的挂载点,
  • 第三点表示当前文件系统的类型,
  • 第四列表示挂载属性(ro或者rw),
  • 第五列和第六列用来匹配/etc/mtab文件中的转储(dump)属性;
$ more /proc/mounts
/dev/sdc / ext4 rw,relatime,discard,errors=remount-ro,data=ordered 0 0
tmpfs /mnt/wsl tmpfs rw,relatime 0 0
tools /init 9p ro,dirsync,relatime,aname=tools;fmask=022,loose,access=client,trans=fd,rfd=6,wfd=6 0 0
none /dev devtmpfs rw,nosuid,relatime,size=6502616k,nr_inodes=1625654,mode=755 0 0
sysfs /sys sysfs rw,nosuid,nodev,noexec,noatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,noatime 0 0
devpts /dev/pts devpts rw,nosuid,noexec,noatime,gid=5,mode=620,ptmxmode=000 0 0
.....

注意:在 2.4.19 以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向 /proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;

$ ll /proc/ |grep mounts
lrwxrwxrwx 1 root root 11 Feb 13 19:50 mounts -> self/mounts

swaps 交换分区信息

当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于 /proc/swap 目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大;

$ more /proc/swaps
Filename Type Size Used Priority
/swap/file file 4194304 0 -2

version 内核版本

当前系统运行的内核版本号

$ more /proc/version
Linux version 5.10.16.3-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220) #1 SMP Fri Ap
r 2 22:23:49 UTC 2021

还会显示系统安装的 gcc 版本

References

E.2.16. /PROC/LOCKS Linux proc目录详解 /proc/iomem和/proc/ioports